/*
 * Copyright 2009,2011, Haiku, Inc.
 * Distributed under the terms of the MIT License.
 */
#ifndef _PACKAGE__HPKG__V1__HPKG_DEFS_H_
#define _PACKAGE__HPKG__V1__HPKG_DEFS_H_


#include <SupportDefs.h>


namespace BPackageKit {

namespace BHPKG {

namespace V1 {


// magic & version of package and repository files
enum {
	B_HPKG_MAGIC	= 'hpkg',
	B_HPKG_VERSION	= 1,
	//
	B_HPKG_REPO_MAGIC	= 'hpkr',
	B_HPKG_REPO_VERSION	= 1
};


// package attribute IDs
enum BHPKGPackageSectionID {
	B_HPKG_SECTION_HEADER					= 0,
	B_HPKG_SECTION_HEAP						= 1,
	B_HPKG_SECTION_PACKAGE_TOC				= 2,
	B_HPKG_SECTION_PACKAGE_ATTRIBUTES		= 3,
	B_HPKG_SECTION_REPOSITORY_INFO			= 4,
	//
	B_HPKG_SECTION_ENUM_COUNT
};


// attribute types
enum {
	// types
	B_HPKG_ATTRIBUTE_TYPE_INVALID			= 0,
	B_HPKG_ATTRIBUTE_TYPE_INT				= 1,
	B_HPKG_ATTRIBUTE_TYPE_UINT				= 2,
	B_HPKG_ATTRIBUTE_TYPE_STRING			= 3,
	B_HPKG_ATTRIBUTE_TYPE_RAW				= 4,
	//
	B_HPKG_ATTRIBUTE_TYPE_ENUM_COUNT
};


// attribute encodings
enum {
	// signed/unsigned int encodings
	B_HPKG_ATTRIBUTE_ENCODING_INT_8_BIT		= 0,
	B_HPKG_ATTRIBUTE_ENCODING_INT_16_BIT	= 1,
	B_HPKG_ATTRIBUTE_ENCODING_INT_32_BIT	= 2,
	B_HPKG_ATTRIBUTE_ENCODING_INT_64_BIT	= 3,

	// string encodings
	B_HPKG_ATTRIBUTE_ENCODING_STRING_INLINE	= 0,
		// null-terminated string
	B_HPKG_ATTRIBUTE_ENCODING_STRING_TABLE	= 1,
		// unsigned LEB128 index into string table

	// raw data encodings
	B_HPKG_ATTRIBUTE_ENCODING_RAW_INLINE	= 0,
		// unsigned LEB128 size, raw bytes
	B_HPKG_ATTRIBUTE_ENCODING_RAW_HEAP		= 1
		// unsigned LEB128 size, unsigned LEB128 offset into the heap
};


// maximum number of bytes of data to be encoded inline; more will be allocated
// on the heap
enum {
	B_HPKG_MAX_INLINE_DATA_SIZE	= 8
};


// name of file containing package information (in package's root folder)
extern const char* const B_HPKG_PACKAGE_INFO_FILE_NAME;


// package attribute IDs
enum BHPKGAttributeID {
	B_HPKG_ATTRIBUTE_ID_DIRECTORY_ENTRY 			=  0,
	B_HPKG_ATTRIBUTE_ID_FILE_TYPE					=  1,
	B_HPKG_ATTRIBUTE_ID_FILE_PERMISSIONS			=  2,
	B_HPKG_ATTRIBUTE_ID_FILE_USER					=  3,
	B_HPKG_ATTRIBUTE_ID_FILE_GROUP					=  4,
	B_HPKG_ATTRIBUTE_ID_FILE_ATIME					=  5,
	B_HPKG_ATTRIBUTE_ID_FILE_MTIME					=  6,
	B_HPKG_ATTRIBUTE_ID_FILE_CRTIME					=  7,
	B_HPKG_ATTRIBUTE_ID_FILE_ATIME_NANOS			=  8,
	B_HPKG_ATTRIBUTE_ID_FILE_MTIME_NANOS			=  9,
	B_HPKG_ATTRIBUTE_ID_FILE_CRTIM_NANOS			= 10,
	B_HPKG_ATTRIBUTE_ID_FILE_ATTRIBUTE				= 11,
	B_HPKG_ATTRIBUTE_ID_FILE_ATTRIBUTE_TYPE			= 12,
	B_HPKG_ATTRIBUTE_ID_DATA						= 13,
	B_HPKG_ATTRIBUTE_ID_DATA_SIZE					= 14,
	B_HPKG_ATTRIBUTE_ID_DATA_COMPRESSION			= 15,
	B_HPKG_ATTRIBUTE_ID_DATA_CHUNK_SIZE				= 16,
	B_HPKG_ATTRIBUTE_ID_SYMLINK_PATH				= 17,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_NAME				= 18,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_SUMMARY				= 19,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_DESCRIPTION			= 20,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_VENDOR				= 21,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_PACKAGER			= 22,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_FLAGS				= 23,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_ARCHITECTURE		= 24,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_MAJOR		= 25,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_MINOR		= 26,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_MICRO		= 27,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_REVISION	= 28,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_COPYRIGHT			= 29,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_LICENSE				= 30,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_PROVIDES			= 31,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_PROVIDES_TYPE		= 32,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_REQUIRES			= 33,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_SUPPLEMENTS			= 34,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_CONFLICTS			= 35,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_FRESHENS			= 36,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_REPLACES			= 37,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_RESOLVABLE_OPERATOR	= 38,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_CHECKSUM			= 39,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_PRE_RELEASE	= 40,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_PROVIDES_COMPATIBLE	= 41,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_URL					= 42,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_SOURCE_URL			= 43,
	B_HPKG_ATTRIBUTE_ID_PACKAGE_INSTALL_PATH		= 44,
	//
	B_HPKG_ATTRIBUTE_ID_ENUM_COUNT,
};


// compression types
enum {
	B_HPKG_COMPRESSION_NONE	= 0,
	B_HPKG_COMPRESSION_ZLIB	= 1
};


// file types (B_HPKG_ATTRIBUTE_ID_FILE_TYPE)
enum {
	B_HPKG_FILE_TYPE_FILE		= 0,
	B_HPKG_FILE_TYPE_DIRECTORY	= 1,
	B_HPKG_FILE_TYPE_SYMLINK	= 2
};


// default values
enum {
	B_HPKG_DEFAULT_FILE_TYPE				= B_HPKG_FILE_TYPE_FILE,
	B_HPKG_DEFAULT_FILE_PERMISSIONS			= 0644,
	B_HPKG_DEFAULT_DIRECTORY_PERMISSIONS	= 0755,
	B_HPKG_DEFAULT_SYMLINK_PERMISSIONS		= 0777,
	B_HPKG_DEFAULT_DATA_COMPRESSION			= B_HPKG_COMPRESSION_NONE,
	B_HPKG_DEFAULT_DATA_CHUNK_SIZE_ZLIB		= 64 * 1024
};


// Writer Init() flags
enum {
	B_HPKG_WRITER_UPDATE_PACKAGE	= 0x01,
		// update the package (don't truncate)
	B_HPKG_WRITER_FORCE_ADD			= 0x02,
		// when updating a pre-existing entry, don't fail, but replace the
		// entry, if possible (directories will be merged, but won't replace a
		// non-directory)
};


}	// namespace V1

}	// namespace BHPKG

}	// namespace BPackageKit


#endif	// _PACKAGE__HPKG__V1__HPKG_DEFS_H_
